\documentclass[fleqn,10pt]{article}
\usepackage{graphicx} % Required for inserting images
\usepackage{xeCJK} 
\usepackage{amsmath}
\usepackage{pgfplots}
\usepackage{tikz}
\usepackage{subcaption}
\usepackage{overpic}
\usepackage{listings}
\usepackage{xcolor} 

\lstset{
    basicstyle=\tt,
    numbers=left,
    escapeinside=``,
}

\title{HW04 插值示例程序}

\author{3220101611 韩耀霆}
\date{\today}

\begin{document}

\flushbottom
\maketitle
\thispagestyle{empty}

\section*{概述}
以下程序是一个使用GNU Scientific Library（GSL）的示例程序，GSL提供了一系列函数和工具，用于处理常见的数学问题，包括插值、数值积分、线性代数、优化、特殊函数、随机数生成等。
GSL 的目标是为科学计算和数值模拟提供高效、可靠和易于使用的工具。在本程序中演示了如何插值给定数据点集合，
使用三次样条插值方法将离散的数据点（共计十个）插值成平滑的曲线，并输出插值结果，
在本次作业中由要求故在$y$值计算结果中加了一个常数3.22010611，其几何直观结果是将原插值函数图像整体沿$y$轴正方向平移3.220101611个单位距离。\\\\
\textbf{注}:代码及注释附文后。

\section*{代码解释}

\textbf{注}:此处不对常见的内容做出解释。

\subsection*{头文件}

\lstset{language=C}
\begin{lstlisting}       
#gsl/gsl_errno.h
#gsl/gsl_spline.h
\end{lstlisting}
这两个头文件是属于GNU Scientific Library (GSL) 的一部分，用于进行科学计算的库。它们提供了一些数值计算和插值的函数和数据结构。具体而言：
\begin{itemize}
    \item \verb|gsl/gsl\_errno.h|：该头文件包含了一些用于处理错误的常量和函数的声明。 \verb|gsl/gsl\_errno.h|提供了一种管理和报告 GSL 函数中的错误的标准机制。
            
    \begin{lstlisting}       
#gsl/gsl_errno.h
    \end{lstlisting}

    \item \verb|gsl/gsl\_spline.h|：这个头文件包含了用于插值和样条曲线拟合的函数和数据结构的声明。
            它定义了 \verb|gsl/gsl\_spline.h| 结构体类型，以及相关的函数和宏，用于插值、拟合和评估光滑函数。
            使用这个头文件可以方便地进行曲线插值操作。
            
    \begin{lstlisting}       
#gsl/gsl_spline.h
    \end{lstlisting}

\end{itemize}

\subsection*{主函数}
主函数中包含了整个程序的执行逻辑，中需要额外注意的有如下几个部分。

\begin{itemize}
    \item \verb|for|循环：通过一个循环生成原始数据点，存储在数组 $x$ 和 $y$ 中，并按照指定格式打印出来。每个 $x[i]$ 的值是 $i + 0.5 * sin(i)，而每个 $y[i] 则是 $i + cos(i^2) + 3.22010611$。
    \begin{lstlisting}        
for(i = 0; i < 10; i++){
    x[i] = i + 0.5 * sin (i);
    y[i] = i + cos (i * i)+3.22010611;
    printf ("%g %g\n", x[i], y[i]);
}    
    \end{lstlisting}

    \item 插值计算：使用GSL（GNU Scientific Library）库中\verb|gsl_interp_accel_alloc()|、\verb|gsl_spline_alloc()|、\verb|gsl_spline_init()|
        和\verb|gsl_spline_eval()|以三次样条插值方法插值计算在\verb|for|循环中生成的十个点并输出。
    \begin{lstlisting}        
{
    gsl_interp_accel *acc= gsl_interp_accel_alloc ();
    gsl_spline *spline= gsl_spline_alloc (gsl_interp_cspline, 10);
    gsl_spline_init (spline, x, y, 10);
        
    for(xi = x[0]; xi < x[9]; xi += 0.01){
        yi = gsl_spline_eval (spline, xi, acc);
        printf ("%g %g\n", xi, yi);
    } 
    gsl_spline_free (spline);
    gsl_interp_accel_free (acc);
}
    \end{lstlisting}

\end{itemize}

\section*{输出结果}
输出结果见后图\verb|Figure 1|。

\begin{figure}[htb]
\centering
\includegraphics[width=0.7\linewidth]{interp.eps}
\caption{程序输出结果(inter.eps)}
\label{fig:view}
\end{figure}

\section*{附}
源代码见文件夹内\verb|main.c|。

\bibliography{sample}

\end{document}